#include <iostream>
#include <vector>

//操作数组中元素往往也是通过双指针算法。
//就地操作，将一个数组的0都复写一遍，数组大小不变

void copy_0_method1(std::vector<int> &v)
{
    for (int left = 0; left < v.size(); left++)
    {
        if (v[left] == 0)
        {
            for (int right = v.size(); right > left + 1; right--)
            {
                v[right] = v[right - 1];
            }
            v[left + 1] = 0;
            left++;
        }
    }
}

void copy_0_method2(std::vector<int>& v)
{
    int cur = 0, des = -1;
    int n = v.size();
    while(cur < n)
    {
        if(v[cur] == 0)
        {
            des += 2;
        }
        else
        {
            des += 1;
        }
        if(des >= n - 1)
        {
            break;
        }
        cur++;
    }

    if(des == n)
    {
        v[n - 1] = 0;
        cur--, des -= 2; 
    }
    while(cur)
    {
        if(v[cur])
        {
            v[des--] = v[cur--];
        }
        else
        {
            v[des--] = 0;
            v[des--] = 0;
            cur--;
        }
    }
}

void copy_0_practice(std::vector<int>& v)
{
    int cur = 0, des = 0;
    while(cur < v.size())
    {
        if(v[cur])
        {
            des++;
        }
        else{
            des += 2;
        }
        if(des >= v.size())
        {
            break;
        }
        cur++;
    }

    if(des == v.size())
    {
        v[v.size() - 1] = 0;
        des -= 2;
    }

    while(cur)
    {
        if(v[cur])
        {
            v[des--] = v[cur--];
        }
        else
        {
            v[des--] = 0;
            v[des--] = 0;
            cur--;
        }
    }
}

int main()
{
    std::vector<int> v = {1, 0, 2, 0, 4};
    //                    1  0  0  2  0  0  4
    copy_0_method2(v);
    for (auto &e : v)
    {
        std::cout << e << std::endl;
    }
    return 0;
}